package com.woniu.service.impl;

import com.woniu.service.EmaillServicec;
import com.woniu.util.ConstantUtil;
import org.slf4j.bridge.SLF4JBridgeHandler;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class EmaillServicecImpl implements EmaillServicec {
    @Resource
    private JavaMailSender javaMailSender;
    @Resource
    private RedisTemplate redisTemplateInit;
    /**
     * 1. 检查邮箱是否已订阅（核心去重逻辑）
     * @param email 待检查邮箱
     * @return true=已订阅，false=未订阅
     */
    @Override
    public boolean isEmailSubscribed(String email) {
        // Redis的Set结构：ISMEMBER 检查元素是否存在（O(1)时间复杂度，极快）

        Boolean emailSubscribed = redisTemplateInit.opsForSet().isMember(ConstantUtil.REDIS_EMAILL_KEY, email);
        // 使用Boolean.TRUE.equals(emailSubscribed)避免自动装箱拆箱可能产生的空指针异常，确保只有当emailSubscribed明确为true时才返回true
        return Boolean.TRUE.equals(emailSubscribed);

    }
    /**
     * 2. 新增订阅：将邮箱存入Redis（2个地方）
     * - Set：用于去重（后续检查是否已订阅）
     * - List：用于暂存新邮箱（待同步到数据库）
     */
    @Override
    public void addNewSubscribeEmail(String email) {
        // 2.1 存入Set（去重）
        redisTemplateInit.opsForSet().add(ConstantUtil.REDIS_EMAILL_KEY, email);

        // 2.2 存入List（待同步），List可批量取数据，效率高
        redisTemplateInit.opsForList().rightPush(ConstantUtil.REDIS_EMAILL_KEY_LIST, email);

        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
          simpleMailMessage.setSubject("订阅成功");
          simpleMailMessage.setText("感谢订阅鲜果优选，后续我们会不定期发送优惠信息");
          simpleMailMessage.setTo(email);
        // 关键：必须设置与授权码一致的发件人  不然会触发502错误
        simpleMailMessage.setFrom("2628963301@qq.com");
        javaMailSender.send( simpleMailMessage);
    }
    /**
     * 3. 批量获取待同步的新邮箱（供定时任务使用）
     * @param count 一次获取多少条（避免一次性取太多，压垮数据库）
     * @return 待同步的邮箱列表
     */

    @Override
    public List<String> getNewEmailsForSync(int count) {
      //获取全部的list
      return   redisTemplateInit.opsForList().range(ConstantUtil.REDIS_EMAILL_KEY_LIST, 0, count - 1);

    }
    /**
     * 4. 同步完成后，删除Redis中已同步的邮箱（避免重复同步）
     * @param count 已同步的数量
     */
    @Override

    public void removeSyncedEmails(int count) {
        // Redis List：LTRIM 保留count之后的元素，删除前面已同步的
        redisTemplateInit.opsForList().trim(ConstantUtil.REDIS_EMAILL_KEY_LIST, count, -1);
    }



}
